/**
  ******************************************************************************
  * @file           : ble_handler.c
  * @author			: duanzhe
  * @brief          : BLE数据处理任务源文件
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 乐普医电.
  *
  ******************************************************************************
  */
#include "ble_handler.h"
#include "ble_fifo.h"
#include "dbg_trace.h"
#include "stm32_seq.h"
#include "p2p_client_app.h"
#include "app_ble.h"
#include "ble.h"


extern fifo_t BleRxFifoQueue;
extern fifo_t BleTxFifoQueue;

/**
  * @brief   任务函数：在P2P的APP服务中被激活(P2PS_STM_App_Notification函数中激活)，每接收到一条BLE数据时执行一次
  * @param   任务函数无入口参数
  * @retval  任务函数无返回参数
  */
void ble_data_receive(void)
{
	uint8_t* p_data = NULL;											/* 从Fifo中读取到的数据的头指针 */
	uint16_t data_length = 0;										/* 从Fifo中读取到的一条数据的字节大小 */
	p_data = FifoQueue_DataOut(&BleRxFifoQueue, &data_length);		/* 从Fifo中获取一条数据 */

	/* 如果正确读取到数据，将数据头指针和数据长度提交给用户处理函数 */
	if (p_data)
	{
		User_BleReceive_Handler(p_data, data_length);
		/* 如果FIFO中还有未读取的数据，继续激活任务函数读取FIFO */
		if (BleRxFifoQueue.bytecount > 0)
		{
			APP_DBG_MSG("rx more data\r\n");
			UTIL_SEQ_SetTask(1 << CFG_TASK_BLE_DATA_RX_ID, CFG_SCH_PRIO_0);
		}
	}
}

/**
  * @brief   用户处理接收到的蓝牙数据处理函数
  * @param   ble_data: 接收到的蓝牙数据首地址
  * @param   data_length: 接收到的蓝牙数据长度
  * @retval  无
  */

void User_BleReceive_Handler(uint8_t* ble_rxdata, uint16_t data_length)
{
	uint16_t index = 0;												/* 索引，用于循环计数 */

    /* 将服务器接收到的数据通过蓝牙通知服务再次发送给客户端 */
	//User_BleTransmit(ble_rxdata, data_length);
	/* 通过串口将接收到的数据打印出来 */
	for (index = 0; index < data_length; index++)
    {
        APP_DBG_MSG("%#x ", ble_rxdata[index]);
        if ((index + 1) % 20 == 0)
        {
			APP_DBG_MSG("\r\n");
        }
    }
    APP_DBG_MSG("\r\n");

}




/**
  * @brief   任务函数：用户调用蓝牙数据发送函数时这个函数被激活，从蓝牙发送数据Fifo中获取数据并通过属性修改函数将数据发送出去
  * @param   任务函数无入口参数
  * @retval  任务函数无返回参数
  */
void ble_data_transmit(void)
{
	uint8_t* p_data = NULL;											/* 从Fifo中读取到的数据的头指针 */
	uint16_t data_length = 0;										/* 从Fifo中读取到的一条数据的字节大小 */
	p_data = FifoQueue_DataOut(&BleTxFifoQueue, &data_length);		/* 从Fifo中获取一条数据 */

	if (p_data)
	{
		Write_Char(P2P_WRITE_CHAR_UUID, 0, p_data, data_length);
		if (BleTxFifoQueue.bytecount > 0)
		{
			APP_DBG_MSG("tx more data\r\n");
			UTIL_SEQ_SetTask(1 << CFG_TASK_BLE_DATA_TX_ID, CFG_SCH_PRIO_0);
		}
		//P2PS_Send_Notification
	}
	APP_DBG_MSG("data transmitted\r\n");
}


/**
  * @brief   用户发送蓝牙数据函数
  * @param  ble_data: 要发送的蓝牙数据首地址
  * @param  data_length: 要发送的蓝牙数据长度
  * @retval 0:数据成功放入FIFO   1:数据放入FIFO失败  2:入口参数错误
  */
uint8_t User_BleTransmit(uint8_t* ble_data, uint16_t NumData)
{
    /* 如果BLE连接断开 */
    if(P2P_Client_APP_Get_State () != APP_BLE_CONNECTED_CLIENT)
    {
    	APP_DBG_MSG("can't transmit data by ble without connection\r\n");
		return 1;
    }
	/* 入口参数检查 */
	if ((ble_data == NULL) || (NumData > 0x7F))
	{
		return 2;
	}
	/* 将数据写入FIFO并检查是否写入成功 */
	if (FifoQueue_DataIn(&BleTxFifoQueue, ble_data, NumData, 1))
	{
	/* 如果写入成功，则激活数据发送任务 */
		UTIL_SEQ_SetTask(1 << CFG_TASK_BLE_DATA_TX_ID, CFG_SCH_PRIO_0);
		return 0;
	}
	else
	{
		return 1;
	}
}
